// 文件名：basic_string_log_format.cpp
// 目的：格式化日志行，包含本地时间戳（微秒精度）、日志级别、来源与消息内容。
// 实现要点：
//   - 获取 system_clock::now()，拆分为 time_t（秒）与微秒 remainder；
//   - 使用 localtime_r / localtime_s 将 time_t 转为本地时间 tm（跨平台分支）；
//   - std::ostringstream + std::put_time 格式化日期时间（%F %T），再手动追加 6 位微秒；
//   - 预留 line 的容量，减少字符串扩容；输出格式："YYYY-MM-DD HH:MM:SS.ffffff LEVEL [source] message"。
// 复杂度：O(1)（与字符串长度线性，但长度固定阶），I/O 为主。
// 注意：
//   - system_clock 受系统时间调整影响；若需单调时间可用 steady_clock（但无法格式化为 civil time）；
//   - 本地时区转换 localtime_r/s 线程安全；若需 UTC，改用 gmtime_r/s；
//   - 格式化性能可用 fmt 库或预分配缓冲 + strftime 优化。

#include <chrono>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <sstream>
#include <string>
#include <string_view>

std::string formatLogLine(std::string level,
                          std::string_view message,
                          std::string_view source) {
    auto now = std::chrono::system_clock::now();
    auto time = std::chrono::system_clock::to_time_t(now);
    auto micros = std::chrono::duration_cast<std::chrono::microseconds>(
                      now.time_since_epoch()).count() % 1'000'000;

    std::tm tm{};
#ifdef _WIN32
    localtime_s(&tm, &time);
#else
    localtime_r(&time, &tm);
#endif

    std::ostringstream oss;
    oss << std::put_time(&tm, "%F %T") << '.'
        << std::setw(6) << std::setfill('0') << micros;
    std::string timestamp = oss.str();

    std::string line;
    line.reserve(timestamp.size() + level.size() + message.size()
                 + source.size() + 8);
    line.append(timestamp);
    line.push_back(' ');
    line.append(level);
    line.append(" [");
    line.append(source);
    line.append("] ");
    line.append(message);
    return line;
}

int main() {
    std::string line = formatLogLine("INFO", "system started", "bootstrap");
    std::cout << line << '\n';
    return 0;
}